package org.ping.news;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.ping.Tool.GetData;
import org.ping.Tool.LogUtil;
/**
 * 获取新闻的类
 * @author PING
 * 1.使用单例模式，
 * 	a.用户获取详细新闻，调用getContent
 *  b.因为都是静态的方法，所以不需要对象就可以使用
 *  c.这里是每隔一个小时候就取爬取一次新闻
 */
public class GetNews implements Runnable {
	//获取数据库链接的工具类
	private static GetData gd = GetData.getInstance();
	
	@Override
	public void run() {
		LogUtil.getLogUtil(this).showlog("爬取新闻数据！----->");
		getTitle("http://tech.sina.com.cn/");
	}  
	//爬取新闻标题和原文链接
	public static void getTitle(String url) {
		try {
			// 这是get方式得到的
			// 根据url爬取html内容
			Document doc = Jsoup.connect(url).timeout(5000).get();
			
			// 获取带href属性的a标签
			Elements links = doc.select("a[href]");
			//只储存50条新闻
			//实际上会更少
			int i = 50;
			for (Element link : links) {
				// 获取这个标签的href属性
				String linkHref = link.attr("href");
				// 获取这个标签的文本
				String linkText = link.text();
				if (linkHref.equals("javascript:;") || linkText.equals("") || linkText.length() < 10
						|| linkHref.indexOf(".shtml") == -1) {
					continue;
				}
				//这里用线程去爬取详细信息
				new java.lang.Thread() {
					@Override
					public void run() {
						//爬取详细数据
						List<String> info = getContent(linkHref);
						if(info.size()>1) {							
							MinuteNews.getInstance().saveData(gd.getConnection(),linkText,linkHref,info);
						}
					}
				}.start();
				
				if(i<=0) {
					break;
				}
				i--;
			}
			//休眠5s，为了上面的详细内容线程能够全部执行完成
			//Thread.currentThread().sleep(5000);
			//每次爬取新闻完成后，都要把新闻存储存到推送类里面
			MinuteNews.getInstance().getData(gd.getConnection());
			
			// System.out.println("***************");
			// 另外一种是post方式
			/*
			 * @SuppressWarnings("unused") Document doc_Post = Jsoup.connect(url)
			 * .data("query","Java") .userAgent("I am jsoup") .cookie("auth","token")
			 * .timeout(10000) .post(); Elements links_Post = doc.select("a[href]");
			 * for(Element link:links_Post){ String linkHref = link.attr("abs:href"); String
			 * linkText = link.text(); //System.out.println(linkText+":"+linkHref);
			 * 
			 * //map.put(linkText, linkHref); }
			 */

		} catch (IOException e) {
			LogUtil.getLogUtil(new GetNews()).showlog("爬去新闻链接超时："+e);
		}
	}
	//爬取详细内容
	public static List<String> getContent(String url) {
		
		List info = new ArrayList();
		
		try {
			// 根据url获取数据
			Document doc = Jsoup.connect(url).timeout(5000).get();
			
			//新浪新闻正文都是由div class的值是article包裹的
			Elements ele = doc.select("div[class=article]");
			
			//爬取新闻正文！
			for (Element el : ele) {
				info.add(el.text());
			}
			
			//爬取日期
			Elements date = doc.select("span[class$=date]");
			for (Element el : date) {
				info.add(el.text());
			}
			
			//爬取新闻图片
			Elements jpg = ele.select("img[src$=.jpg]");
			for (Element j : jpg) {
				info.add(j.attr("src"));
			}

		} catch (IOException e) {
			LogUtil.getLogUtil(new GetNews()).showlog(e);
		}
		return info;
	}
}
